/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5.gestionAsientos;

import org.joda.time.LocalDate;
import org.uca.dss.curso2011.grupo5.Args;
import org.uca.dss.curso2011.grupo5.interfazExtendido.InformacionTrayecto;

/**
 *
 * @author Luis
 */
public class AsignarAsiento
{
    private GestionAsientos gestionAsientos;

    /**
     * Establece la estrategia para la selección de asientos en función del tipo de objeto que recibe como parámetro
     * @param gestionAsientos Objeto de la clase que se haya seleccionado para gestionar los asientos
     * @throws CloneNotSupportedException
     * @throws IllegalArgumentException
     */
    public void setEstrategiaSeleccion(GestionAsientos gestionAsientos) throws CloneNotSupportedException, IllegalArgumentException
    {
        Args.comprobarNulo(gestionAsientos);

        this.gestionAsientos = (GestionAsientos) gestionAsientos.clone();
    }

    /**
     * Selecciona el número de asiento en el tren seleccionado para la reserva.
     * @param gestionAsientos Objeto de la clase que se haya seleccionado para gestionar los asientos
     * @return numAsientos Nº de asiento de la reserva
     * @throws CloneNotSupportedException
     * @throws IllegalArgumentException
     */
    public int seleccionaAsiento(InformacionTrayecto iT, LocalDate fecha) throws IllegalArgumentException, RuntimeException
    {
        Args.comprobarNulo(iT);
        Args.comprobarNulo(fecha);
        
        if (gestionAsientos == null)
        {
            throw new RuntimeException("AsignarAsiento: No se ha establecido la estrategia de selección de asientos.");
        }

        return gestionAsientos.apply(iT,fecha);
    }

}
